Pular para o conteúdo principal
Versões: 0.3.x

Usando o AiNet

Acesse o Jupyter Notebook com o código disponível aqui!

Execute o notebook online via Binder: Binder

Introdução

A clusterização é uma tarefa de aprendizado de máquina não supervisionado que visa agrupar um conjunto de dados no mesmo grupo (chamado de cluster).

Neste notebook, exploraremos o AiNet (Artificial Immune Network). O AiNet utiliza conceitos como afinidade de anticorpos e supressão de clones para identificar os centros dos clusters nos dados.

Objetivo: O objetivo é demonstrar a eficácia do AiNet na clusterização dos conjuntos de dados random:

  • Blobs: Clusters bem definidos e esféricos.
  • Moons: Clusters com uma forma não linear.
  • Circles: Clusters dispostos em dois círculos concêntricos, apresentando separação não linear.

Estrutura do Notebook:

  • Configuração: Instalação e importação das bibliotecas necessárias.
  • Função de Visualização: Definição de uma função para plotar os resultados.
  • Demonstração 1 - Dataset Blobs: Aplicação do AiNet ao blobs.
  • Demonstração 2 - Dataset Moons: Aplicação do AiNet ao moons.
  • Demonstração 3 - Dataset Circles: Aplicação do AiNet ao circles.

Importando a Rede Imune Artificial

from aisp.ina import AiNet

Função de Visualização

Função de Visualização do AiNet (plota agrupamentos e a rede imune)
def plot_immune_network(train_x, predict_y, model, title_prefix=""):
"""
Plota os resultados da clusterização da AiNet.

Paramentos:
train_x (np.array): Os dados de entrada.
predict_y (np.array): As previsões de cluster do modelo.
model (AiNet): O modelo AiNet treinado.
title_prefix (str, optional): Um prefixo para os títulos dos gráficos.
"""
clusters = list(model._memory_network.values())
network = np.array(model._population_antibodies)

_, axs = plt.subplots(2, 2, figsize=(12, 12))
colors = colormaps.get_cmap('Accent')

# Dados originais
axs[0][0].scatter(train_x[:, 0], train_x[:, 1], color='dodgerblue', alpha=0.9, s=50, marker='o', edgecolors='k')
axs[0][0].set_title(f'{title_prefix}Dados Originais', fontsize=16)
axs[0][0].set_xlabel('X', fontsize=14)
axs[0][0].set_ylabel('Y', fontsize=14)
axs[0][0].grid(True, linestyle='--', alpha=0.5)

# População de anticorpos
axs[0][1].scatter(network[:, 0], network[:, 1], color='crimson', alpha=0.9, s=70, marker='.', edgecolors='k')
axs[0][1].set_title(f'{title_prefix}População de Anticorpos', fontsize=16)
axs[0][1].set_xlabel('X', fontsize=14)
axs[0][1].set_ylabel('Y', fontsize=14)
axs[0][1].grid(True, linestyle='--', alpha=0.5)

# Previsões dos clusters
scatter = axs[1][0].scatter(train_x[:, 0], train_x[:, 1], c=predict_y, cmap='Accent', s=50, edgecolors='k', alpha=0.9)
axs[1][0].set_title(f'{title_prefix}Previsões dos Clusters (AiNet)', fontsize=16)
axs[1][0].set_xlabel('X', fontsize=14)
axs[1][0].set_ylabel('Y', fontsize=14)
axs[1][0].grid(True, linestyle='--', alpha=0.5)
legend1 = axs[1][0].legend(*scatter.legend_elements(), title="Clusters")
axs[1][0].add_artist(legend1)

# Grafo da Rede Imune
G = nx.Graph()
positions = {}
for i, cluster in enumerate(clusters):
cluster_nodes = [f'{i}_{j}' for j in range(len(cluster))]
G.add_nodes_from(cluster_nodes)
for node, point in zip(cluster_nodes, cluster):
positions[node] = tuple(point)
dist_matrix = squareform(pdist(cluster))
mst_local = minimum_spanning_tree(dist_matrix).toarray()
for row_idx, row in enumerate(mst_local):
for col_idx, weight in enumerate(row):
if weight > 0:
G.add_edge(cluster_nodes[row_idx], cluster_nodes[col_idx], weight=weight)
for i, cluster in enumerate(clusters):
cluster_nodes = [f'{i}_{j}' for j in range(len(cluster))]
nx.draw_networkx_nodes(G, positions, nodelist=cluster_nodes, ax=axs[1][1],
node_color=[colors(i)], node_size=70, edgecolors='k', label=f'Cluster {i}')
nx.draw_networkx_edges(G, positions, ax=axs[1][1], alpha=0.6)
axs[1][1].set_title(f'{title_prefix}Rede Imune Grafo', fontsize=16)
axs[1][1].set_xlabel('X', fontsize=14)
axs[1][1].set_ylabel('Y', fontsize=14)
axs[1][1].grid(True, linestyle='--', alpha=0.5)
axs[1][1].legend()
plt.tight_layout()
plt.show()

Demonstração 1 - Dataset Blobs

Gerando bolhas de dados

samples, output = make_blobs(
n_samples=1000,
cluster_std=0.07,
center_box=(0.0, 1.0),
centers=[[0.25, 0.75], [0.75, 0.25]],
random_state=1234,
)

Treinando o modelo AiNet

model = AiNet(suppression_threshold=0.96, affinity_threshold=0.95, mst_inconsistency_factor=3, seed=123)
predict_y = model.fit_predict(samples)

Output:

✔ Set of memory antibodies for classes (0, 1) successfully generated | Clusters: 2 | Population of antibodies size: 119:  ┇██████████┇ 10/10 total training interactions

Silhouette score

silhouette = silhouette_score(samples, predict_y)
print(f"Coeficiente de Silhueta: {silhouette:.3f}")

Output:

Coeficiente de Silhueta: 0.826

Visualizando os resultados

plot_immune_network(samples, predict_y, model, title_prefix="Blobs - ")

Blobs


Demonstração 2 - Moons Dataset

Gerando dados em formato de "moons" (luas)

samples, output = make_moons(n_samples=1000, noise=0.05, random_state=42)
samples = MinMaxScaler().fit_transform(samples)

Treinando o AiNet

model = AiNet(suppression_threshold=0.95, affinity_threshold=0.97, mst_inconsistency_factor=2.5, seed=123)
predict_y = model.fit_predict(samples)

Output:

✔ Set of memory antibodies for classes (0, 1) successfully generated | Clusters: 2 | Population of antibodies size: 69:  ┇██████████┇ 10/10 total training interactions

Silhouette score

silhouette = silhouette_score(samples, predict_y)
print(f"Coeficiente de Silhueta: {silhouette:.3f}")

Output:

Coeficiente de Silhueta: 0.398

Visualizando

plot_immune_network(samples, predict_y, model, title_prefix="Moons - ")

Moons


Demonstração 3 - Circles Dataset

Gerando dados em formato de círculos concêntricos

samples, output = make_circles(n_samples=1000, noise=0.05, factor=0.5, random_state=42)
samples = MinMaxScaler().fit_transform(samples)

Training AiNet

model = AiNet(suppression_threshold=0.97, affinity_threshold=0.98, mst_inconsistency_factor=3.8, seed=123)
predict_y = model.fit_predict(samples)

Output:

✔ Set of memory antibodies for classes (0, 1) successfully generated | Clusters: 2 | Population of antibodies size: 169:  ┇██████████┇ 10/10 total training interactions

Silhouette score

silhouette = silhouette_score(samples, predict_y)
print(f"Coeficiente de Silhueta: {silhouette:.3f}")

Output:

Coeficiente de Silhueta: 0.112

Visualizando o AiNet nos dados de círculos

plot_immune_network(samples, predict_y, model, title_prefix="Circles - ")